﻿#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>

//int main()
//{
//	int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
//	printf("&arr[0] = %p\n", &arr[0]);
//	printf("arr     = %p\n", arr);
//	return 0;
//}

//int main()
//{
//	int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
//	printf("%d\n", sizeof(arr));
//	return 0;
//}

//int main()
//{
//	int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
//	printf(" arr = %p\n", arr);
//	printf("&arr = %p\n", &arr);
//	return 0;
//}


//int main()
//{
//	int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
//	printf("arr    =%p\n", arr);
//	printf("arr+1  =%p\n", arr + 1);
//	printf("&arr   =%p\n", &arr);
//	printf("&arr+1 =%p\n", &arr + 1);
//	return 0;
//}

//int main()
//{
//	int arr[10] = { 0 };
//	int len = sizeof(arr) / sizeof(arr[0]);
//	int* p = arr;
//	int i;
//	for (i = 0; i < len; i++)
//	{
//		scanf("%d", p + i);
//	}
//
//	for (i = 0; i < len; i++)
//	{
//		printf("%d ", *(p + i));
//	}
//	return 0;
//}

//int main()
//{
//	int arr[10] = { 0 };
//	int len = sizeof(arr) / sizeof(arr[0]);
//	int* p = arr;
//	int i = 0;
//
//	for (i = 0; i < len; i++)
//	{
//		scanf("%d", p+i);
//	}
//
//	for (i = 0; i < len; i++)
//	{
//		printf("%d ", p[i]);
//	}
//	return 0;
//}

//int arr_length(int arr[])
//{
//	int length = sizeof(arr) / sizeof(arr[0]);
//	return length;
//}
//
//int main()
//{
//	int arr[10] = { 0 };
//	int len = arr_length(arr);
//	printf("%d\n", len);
//	return 0;
//}

//void test1(int arr[])//形参写成数组形式，本质上还是指针
//{
//	printf("%d\n", sizeof(arr));
//}
//
//void test2(int* arr)//形参写成指针形式
//{
//	printf("%d\n", sizeof(arr));
//}
//
//int main()
//{
//	int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
//	test1(arr);
//	test2(arr);
//	return 0;
//}


//void bubble_sort(int arr[], int len)
//{
//	//趟数
//	for (int i = 0; i < len - 1; i++)
//	{
//		//假设这一趟是有序的
//		int flag = 1;
//		//一趟里面找到最大数放在最后面
//		for (int j = 0; j < len - i - 1; j++)
//		{
//			//相邻两两依次比较，前面比后面大就交换顺序
//			if (arr[j] > arr[j + 1])
//			{
//				int tmp = arr[j];
//				arr[j] = arr[j + 1];
//				arr[j + 1] = tmp;
//				//进行交换就说明无序
//				flag = 0;
//			}
//		}
//
//		//如果这一趟没交换就说明整体有序了，无需进行后续排序
//		if (flag == 1)
//		{
//			break;
//		}
//	}
//}
//
//int main()
//{
//	int arr[10] = { 10,9,8,7,6,5,4,3,2,1 };
//	int len = sizeof(arr) / sizeof(arr[0]);
//	bubble_sort(arr, len);
//	for (int i = 0; i < len; i++)
//	{
//		printf("%d ", arr[i]);
//	}
//	return 0;
//}



//int* arr[10];
//char* arr[10];

//int main()
//{
//	int arr1[] = { 1,2,3,4,5 };
//	int arr2[] = { 2,3,4,5,6 };
//	int arr3[] = { 3,4,5,6,7 };
//	int* parr[3] = { arr1, arr2, arr3 };
//
//	for (int i = 0; i < 3; i++)
//	{
//		for (int j = 0; j < 5; j++)
//		{
//			printf("%d ", parr[i][j]);
//		}
//		printf("\n");
//	}
//	return 0;
//}

//int main()
//{
//	char ch = 'w';
//	char* pc = &ch;
//	printf("%c\n", *pc);
//	*pc = 'q';
//	printf("%c\n", ch);
//	return 0;
//}

//int main()
//{
//	char* pstr = "hello world";
//	printf("%s\n", pstr);
//	return 0;
//}

//int main()
//{
//	char arr[] = "hello world";
//	char* p = "hello world";
//	//*p = 'q';//error
//	printf("%c\n", *p);
//	return 0;
//}

//int main()
//{
//	char arr[] = "abcdef";
//	char* p = arr;
//	printf("%s\n", arr);
//	printf("%s\n", p);
//	return 0;
//}


//#include<string.h>
//
//int main()
//{
//	char* p = "hello world";
//	//方法一：直接打印字符指针变量
//	printf("%s\n", p);
//	//方法二：直接打印字符串内容
//	printf("%s\n", "hello world");
//
//	//方法三：通过解引用依次打印字符
//	int len = strlen(p);
//	for (int i = 0; i < len; i++)
//	{
//		printf("%c", *(p + i));
//	}
//	return 0;
//}
//int main()
//{
//	char str1[] = "hello world";
//	char str2[] = "hello world";
//	const char* str3 = "hello world";
//	const char* str4 = "hello world";
//	if (str1 == str2)
//		printf("str1 and str2 are same\n");
//	else
//		printf("str1 and str2 are not same\n");
//	if (str3 == str4)
//		printf("str3 and str4 are same\n");
//	else
//		printf("str3 and str4 are not same\n");
//	return 0;
//}

//int main()
//{
//	int arr[10] = { 0 };
//	int(*p)[10] = &arr;
//	return 0;
//}

//int main()
//{
//	char* arr[5];
//	char* (*p)[5] = &arr;
//	return 0;
//}

//int main()
//{
//	int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
//	int* p = arr;
//	int len = sizeof(arr) / sizeof(arr[0]);
//	for (int i = 0; i < len; i++)
//	{
//		printf("%d ", *(p + i));
//	}
//	return 0;
//}

//int main()
//{
//	int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
//	int(*p)[10] = &arr;
//	int len = sizeof(arr) / sizeof(arr[0]);
//	for (int i = 0; i < len; i++)
//	{
//		printf("%d ", (*p)[i]);//不能采用+1因为是代表的是整个数组，只能挨个访问
//	}
//	return 0;
//}

//void test(int a[3][5], int rows, int cols)
//{
//	for (int i = 0; i < rows; i++)
//	{
//		for (int j = 0; j < cols; j++)
//		{
//			printf("%d ", a[i][j]);
//		}
//		printf("\n");
//	}
//}
//
//int main()
//{
//	int arr[3][5] = { {1,2,3,4,5}, {2,3,4,5,6},{3,4,5,6,7} };
//	test(arr, 3, 5);
//	return 0;
//}

//void test(int(*p)[5], int r, int c)
//{
//	for (int i = 0; i < r; i++)
//	{
//		for (int j = 0; j < c; j++)
//		{
//			printf("%d ", (*(p + i))[j]);
//		}
//		printf("\n");
//	}
//}
//
//int main()
//{
//	int arr[3][5] = { {1,2,3,4,5}, {2,3,4,5,6},{3,4,5,6,7} };
//	test(arr, 3, 5);
//	return 0;
//}


//void test()
//{
//	printf("hehe\n");
//}
//
//int main()
//{
//	printf("test:  %p\n", test);
//	printf("&test: %p\n", &test);
//	return 0;
//}

//void test()
//{
//	printf("hehe\n");
//}
//
//void (*pf1)() = test;
//
//int Add(int x, int y)
//{
//	return x + y;
//}
//
//int(*pf2)(int, int) = Add;
//


//int Add(int x, int y)
//{
//	return x + y;
//}
//
//int main()
//{
//	int(*pf)(int, int) = Add;
//	printf("%d\n", (*pf)(2, 3));
//	printf("%d\n", pf(2, 3));
//	return 0;
//}
//int main()
//{
//	(*(void (*)())0)()
//}


//typedef unsigned int uint;
//int main()
//{
//	uint n;
//	return 0;
//}



//typedef int* pint;
//int main()
//{
//	pint p = NULL;
//	return 0;
//}


//typedef int(*parr_t)[5];
//int main()
//{
//	int arr[5] = { 0 };
//	parr_t p2 = &arr;
//	return 0;
//}

//void test(char* s)
//{
//	
//}
//
//typedef void(*pf_t)(char*);
//int main()
//{
//	pf_t pf = test;
//	return 0;
//}


//void(*)(int)  signal(int, void(*)(int));
//
//typedef void(*pf_t)(int);
//pf_t signal(int, pf_t);

//typedef int* ptr_t;
//#define PTR_T int*
//int main()
//{
//	ptr_t p1, p2;
//	PTR_T p3, p4;
//	return 0;
//}


//int Add(int x, int y)
//{
//	return x + y;
//}
//
//int Sub(int x, int y)
//{
//	return x - y;
//}
//
//int Mul(int x, int y)
//{
//	return x * y;
//}
//
//int Div(int x, int y)
//{
//	return x / y;
//}
//
//int main()
//{
//	int (*pfArr[4])(int, int) = { Add,Sub,Mul,Div };
//	for (int i = 0; i < 4; i++)
//	{
//		int ret = pfArr[i](8, 4);
//		printf("%d\n", ret);
//	}
//	return 0;
//}


//int Add(int x, int y)
//{
//	return x + y;
//}
//
//int Sub(int x, int y)
//{
//	return x - y;
//}
//
//int Mul(int x, int y)
//{
//	return x * y;
//}
//
//int Div(int x, int y)
//{
//	return x / y;
//}
//
//
//void menu()
//{
//	printf("************************************\n");
//	printf("******* 1.加法     2.减法   ********\n");
//	printf("******* 3.乘法     4.除法   ********\n");
//	printf("*******       0.退出        ********\n");
//	printf("************************************\n");
//}
//
//int main()
//{
//	int input = 0;
//	int x = 0;
//	int y = 0;
//	int ret = 0;
//	do
//	{
//		menu();
//		printf("请选择：");
//		scanf("%d", &input);
//		switch (input)
//		{
//		case 1:
//			printf("请输入2个操作数：");
//			scanf("%d %d", &x, &y);
//			ret = Add(x, y);
//			printf("%d\n", ret);
//			break;
//		case 2:
//			printf("请输入2个操作数：");
//			scanf("%d %d", &x, &y);
//			ret = Sub(x, y);
//			printf("%d\n", ret);
//			break;
//		case 3:
//			printf("请输入2个操作数：");
//			scanf("%d %d", &x, &y);
//			ret = Mul(x, y);
//			printf("%d\n", ret);
//			break;
//		case 4:
//			printf("请输入2个操作数：");
//			scanf("%d %d", &x, &y);
//			ret = Div(x, y);
//			printf("%d\n", ret);
//			break;
//		case 0:
//			printf("退出计算器\n");
//			break;
//		default:
//			printf("选择错误，重新选择\n");
//			break;
//		}
//	} while (input);
//	return 0;
//}


//代码二：
//int Add(int x, int y)
//{
//	return x + y;
//}
//
//int Sub(int x, int y)
//{
//	return x - y;
//}
//
//int Mul(int x, int y)
//{
//	return x * y;
//}
//
//int Div(int x, int y)
//{
//	return x / y;
//}
//
//void menu()
//{
//	printf("***********************************\n");
//	printf("******* 1.加法     2.减法   *******\n");
//	printf("******* 3.乘法     4.除法   *******\n");
//	printf("*******       0.exit        *******\n");
//	printf("***********************************\n");
//}
//
//int main()
//{
//	int input = 0;
//	int x = 0;
//	int y = 0;
//	int ret = 0;
//	int (*pfArr[5])(int, int) = { NULL,Add,Sub,Mul,Div };
//	do
//	{
//		menu();
//		printf("请选择：");
//		scanf("%d", &input);
//		if (input >= 1 && input <= 4)
//		{
//			printf("请输入2个整数：");
//			scanf("%d %d", &x, &y);
//			ret = pfArr[input](x, y);
//			printf("结果为：%d\n", ret);
//		}
//		else if (input == 0)
//		{
//			printf("退出计算器\n");
//			break;
//		}
//		else
//		{
//			printf("选择错误，重新选择\n");
//		}
//	} while (input);
//	return 0;
//}



//int Add(int x, int y)
//{
//	return x + y;
//}
//
//int Sub(int x, int y)
//{
//	return x - y;
//}
//
//int Mul(int x, int y)
//{
//	return x * y;
//}
//
//int Div(int x, int y)
//{
//	return x / y;
//}
//
//void menu()
//{
//	printf("***********************************\n");
//	printf("******* 1.加法     2.减法   *******\n");
//	printf("******* 3.乘法     4.除法   *******\n");
//	printf("*******       0.exit        *******\n");
//	printf("***********************************\n");
//}
//
//void calc(int(*pf)(int, int))
//{
//	int x = 0;
//	int y = 0;
//	int ret = 0;
//	printf("请输入两个操作数：\n");
//	scanf("%d %d", &x, &y);
//	ret = pf(x, y);
//	printf("结果为%d\n", ret);
//}
//
//int main()
//{
//	int input = 0;
//	do
//	{
//		menu();
//		printf("请选择：");
//		scanf("%d", &input);
//		switch (input)
//		{
//		case 1:
//			calc(Add);
//			break;
//		case 2:
//			calc(Sub);
//			break;
//		case 3:
//			calc(Mul);
//			break;
//		case 4:
//			calc(Div);
//			break;
//		case 0:
//			printf("退出计算器...\n");
//			break;
//		default:
//			printf("选择错误，请重新选择:\n");
//			break;
//		}
//	} while (input == 0);
//	return 0;
//}


//void qsort(void* base, size_t num, size_t size, int(*compar)(const void*));

//#include<stdlib.h>//qsort函数
//
//int cmp_int(const void* p1, const void* p2)
//{
//	return *(int*)p1 - *(int*)p2;
//}
//
//int main()
//{
//	int arr[] = { 10,9,8,7,6,5,4,3,2,1 };
//	int len = sizeof(arr) / sizeof(arr[0]);
//	qsort(arr, len, sizeof(arr[0]), cmp_int);
//
//	for (int i = 0; i < len; i++)
//	{
//		printf("%d ", arr[i]);
//	}
//	return 0;
//}

//#include<stdlib.h>//qsort
//#include<string.h>//strcmp
//
//struct Stu
//{
//    char name[20];
//    int age;
//};
//
//int cmp_by_age(const void* p1, const void* p2) 
//{
//    return ((struct Stu*)p1)->age - ((struct Stu*)p2)->age;//升序
//}
//
//int cmp_by_name(const void* p1, const void* p2)
//{
//    return strcmp(((struct Stu*)p1)->name, ((struct Stu*)p2)->name);//升序
//}
//
//int main()
//{
//    struct Stu arr[3] = { {"zhangsan", 20}, {"lisi", 35}, {"wangwu", 18} };
//    int len = sizeof(arr) / sizeof(arr[0]);
//
//    //按年龄排序
//   /* qsort(arr, len, sizeof(arr[0]), cmp_by_age);*/
//    //按名字排序
//    qsort(arr, len, sizeof(arr[0]), cmp_by_name);
//
//    for (int i = 0; i < len; i++)
//    {
//        printf("Name: %s, Age: %d\n", arr[i].name, arr[i].age);
//    }
//    return 0;
//}


//void bubble_sort(int arr[], int len)
//{
//	for (int i = 0; i <len - 1; i++)
//	{
//		for (int j = 0; j < len - 1 - i; j++)
//		{
//			if (arr[j] > arr[j + 1])
//			{
//				int tmp = arr[j];
//				arr[j] = arr[j + 1];
//				arr[j + 1] = tmp;
//			}
//		}
//	}
//}


//#include<stdlib.h>//qsort函数的头文件
//#include<string.h>//strcmp的头文件
//
//
//int cmp_int(const void* p1, const void* p2) 
//{
//    return (*(int*)p1 - *(int*)p2); 
//}
//
////交换函数
//void Swap(char* buf1, char* buf2, size_t width) 
//{
//    //一个字节一个字节的进行交换
//    for (int i = 0; i < width; i++)
//    {
//        char tmp = *buf1;
//        *buf1 = *buf2;
//        *buf2 = tmp;
//        buf1++;
//        buf2++;
//    }
//}
//
//void bubble_sort(void* base, size_t len, size_t width, int (*cmp)(const void* p1, const void* p2))//cmp是函数指针，指向比较函数cmp_t
//{
//    //趟数
//    for (int i = 0; i < len - 1; i++)
//    {
//        //一趟内部
//        for (int j = 0; j < len - 1 - i; j++)
//        {
//            //比较前后两个元素
//            if (cmp((char*)base + j * width, (char*)base + (j + 1) * width) > 0)
//            {
//                //交换函数
//                Swap((char*)base + j * width, (char*)base + (j + 1) * width, width);
//            }
//        }
//    }
//}
//
//
//
//int main()
//{
//    int arr[] = { 10,9,8,7,6,5,4,3,2,1 };
//    int len = sizeof(arr) / sizeof(arr[0]);
//    bubble_sort(arr, len, sizeof(arr[0]), cmp_int);// cmp_int函数作为参数传递给了cmp：
//   
//    for (int i = 0; i < len; i++)
//    {
//        printf("%d ", arr[i]);
//    }
//    return 0;
//}

//#include<stdlib.h>//qsort函数
//#include<string.h>//strcmp函数
//
//struct Stu
//{
//    char name[20];
//    int age;
//};
//
//int cmp_by_age(const void* p1, const void* p2) 
//{
//    return ((struct Stu*)p1)->age - ((struct Stu*)p2)->age; 
//}
//
//
//int cmp_by_name(const void* p1, const void* p2) 
//{
//    return strcmp(((struct Stu*)p1)->name, ((struct Stu*)p2)->name);
//}
//
//
////交换函数
//void Swap(char* buf1, char* buf2, size_t width)
//{
//    //一个字节一个字节的进行交换
//    for (int i = 0; i < width; i++)
//    {
//        char tmp = *buf1;
//        *buf1 = *buf2;
//        *buf2 = tmp;
//        buf1++;
//        buf2++;
//    }
//}
//
//void bubble_sort(void* base, size_t len, size_t width, int (*cmp)(const void* p1, const void* p2))//cmp是函数指针，指向比较函数cmp_t
//{
//    //趟数
//    for (int i = 0; i < len - 1; i++)
//    {
//        //一趟内部
//        for (int j = 0; j < len - 1 - i; j++)
//        {
//            //比较前后两个元素
//            if (cmp((char*)base + j * width, (char*)base + (j + 1) * width) > 0)
//            {
//                //交换函数
//                Swap((char*)base + j * width, (char*)base + (j + 1) * width, width);
//            }
//        }
//    }
//}
//
//int main()
//{
//    struct Stu arr[3] = { {"zhangsan",20},{"lisi",35},{"wangwu",18} };
//    int len = sizeof(arr) / sizeof(arr[0]);
//    bubble_sort(arr, len, sizeof(arr[0]), cmp_by_name);
//
//    for (int i = 0; i < len; i++)
//    {
//        printf("Name: %s, Age: %d\n", arr[i].name, arr[i].age);
//    }
//    return 0;
//}


//int main()
//{
//	int a = 10;
//	printf("%d\n", sizeof(a));
//	printf("%d\n", sizeof(int));
//	return 0;
//}

//#include<string.h>
//int main()
//{
//	char str[] = "abcdef";
//	printf("%zd\n", strlen(str));
//	return 0;
//}

//int main()
//{
//	int a[] = { 1,2,3,4 };
//
//	//特例：计算整个数组的大小  16个字节
//	printf("%d\n", sizeof(a));
//
//	//数组首元素地址+0还是首元素地址，地址大小4/8个字节
//	printf("%d\n", sizeof(a + 0));
//
//	//*a是数组首元素，大小4个字节
//	printf("%d\n", sizeof(*a));
//
//	//数组首元素地址+1是第二个元素地址，地址大小4/8个字节
//	printf("%d\n", sizeof(a + 1));
//
//	//第二个元素，大小4个字节
//	printf("%d\n", sizeof(a[1]));
//
//	//&a整个数组的地址，地址大小4/8个字节
//	printf("%d\n", sizeof(&a));
//
//	//*和&抵消，特例：计算整个数组的大小 16个字节
//	printf("%d\n", sizeof(*&a));
//
//	//整个数组地址+1，地址大小4/8个字节
//	printf("%d\n", sizeof(&a + 1));
//
//	//数组首元素地址，地址大小4/8个字节
//	printf("%d\n", sizeof(&a[0]));
//
//	///数组首元素地址+1，是第二个元素地址，地址大小4/8个字节
//	printf("%d\n", sizeof(&a[0] + 1));
//
//	return 0;
//}

//int main()
//{
//	char arr[] = "abcdef";//字符串后面还隐含了一个字符'\0'
//
//	//特例：计算整个数组的大小 7个字节  
//	printf("%d\n", sizeof(arr));
//
//	//数组首元素地址+0，还是首元素地址  地址大小4/8个字节
//	printf("%d\n", sizeof(arr + 0));
//
//	//*arr是数组首元素 大小1个字节
//	printf("%d\n", sizeof(*arr));
//	
//	//数组第二个元素 大小1个字节
//	printf("%d\n", sizeof(arr[1]));
//
//	//整个数组地址  地址大小4/8个字节
//	printf("%d\n", sizeof(&arr));
//
//	//整个数组地址+1  地址大小4/8个字节
//	printf("%d\n", sizeof(&arr + 1));
//
//	//数组首元素地址+1是第二个元素地址 地址大小4/8个字节
//	printf("%d\n", sizeof(&arr[0] + 1));
//
//	return 0;
//}



//int main()
//{
//	char arr[] = "abcdef";
//
//	//数组首元素地址到'\0'前有6个字符
//	printf("%d\n", strlen(arr));
//
//	//首元素地址+0，还是首元素地址，到'\0'前有6个字符
//	printf("%d\n", strlen(arr + 0));
//
//	//数组首元素，不是地址 error
//	/*printf("%d\n", strlen(*arr));*/
//
//	//数组第二个元素，不是地址 error
//	/*printf("%d\n", strlen(arr[1]));*/
//
//	//整个数组地址，也是首元素地址，到'\0'前也有6个字符
//	printf("%d\n", strlen(&arr));
//
//	//整个数组地址+1，到'\0'前字符未知
//	printf("%d\n", strlen(&arr + 1));
//
//	//数组首元素地址+1，第二个元素的地址到'\0'前有5个字符
//	printf("%d\n", strlen(&arr[0] + 1));
//	
//	return 0;
//}

//int main()
//{
//	int a[3][4] = { 0 };
//
//	//特例：计算整个二维数组大小  3*4*4=48个字节
//	printf("%d\n", sizeof(a));
//
//	//二维数组第一行第一个元素  大小4个字节
//	printf("%d\n", sizeof(a[0][0]));
//
//	//二维数组第一行 大小4*4=16个字节
//	printf("%d\n", sizeof(a[0]));
//
//	//这里a[0]表示二维数组第一行第一个元素地址&a[0][0]  +1是第一行第二个元素地址&a[0][1]  地址大小4/8个字节
//	printf("%d\n", sizeof(a[0] + 1));
//
//	//第一行第二个元素 大小4个字节
//	printf("%d\n", sizeof(*(a[0] + 1)));
//
//	//a表示二维数组首元素地址，也就是第一行地址，+1是第二行地址  地址大小4/8个字节
//	printf("%d\n", sizeof(a + 1));
//
//	//第二行 大小4*4=16个字节
//	printf("%d\n", sizeof(*(a + 1)));
//
//	//&a[0]是第一行地址，+1是第二行地址 地址大小4/8个字节
//	printf("%d\n", sizeof(&a[0] + 1));
//
//	///第二行 大小4*4=16个字节
//	printf("%d\n", sizeof(*(&a[0] + 1)));
//
//	//二维数组首元素，也就是第一行 大小4*4=16个字节
//	printf("%d\n", sizeof(*a));
//	
//	//第四行 大小4*4=16个字节
//	printf("%d\n", sizeof(a[3]));
//
//	return 0;
//}


//int main()
//{
//	int a[5] = { 1,2,3,4,5 };
//	int* ptr = (int*)(&a + 1);
//	printf("%d %d\n", *(a + 1), *(ptr - 1));
//	return 0;
//}

//int main()
//{
//	int a[3][2] = { (0,1),(2,3),(4,5) };//二维数组
//	int* p;
//	p = a[0];//a[0]是第一行的数组名，数组名表示首元素的地址，其实就是&a[0][0]这个地址
//	printf("%d", p[0]);//p[0]=*(p+0)=*p 对p解引用也就是首元素
//	return 0;
//}
//
//int main()
//{
//	int a[3][2] = { (0,1),(2,3),(4,5) };
//	int* p;
//	p = a[0];
//	printf("%d", p[0]);
//	return 0;
//}

//int main()
//{
//	int a[5][5];//5列可以排成一行来看
//	int(*p)[4];//p是一个数组指针，p指向的数组是4个整型元素的，p是以四个元素为一组
//	p = a;//p会在a的基础上进行自己的逻辑运算
//	printf("%p,%d\n", &p[4][2] - &a[4][2], &p[4][2] - &a[4][2]);//FFFFFFFC , -4
//	return 0;
//}

//int main()
//{
//	int a[5][5];
//	int(*p)[4];
//	p = a;
//	printf("%p %d\n", &p[4][2] - &a[4][2], &p[4][2] - &a[4][2]);
//	return 0;
//}


//int main()
//{
//	int aa[2][5] = { 1,2,3,4,5,6,7,8,9,10 };
//	int* ptr1 = (int*)(&aa + 1);
//	int* ptr2 = (int*)(*(aa + 1));
//	printf("%d %d\n", *(ptr1 - 1), *(ptr2 - 1));
//	return 0;
//}


//int main()
//{
//	char* a[] = { "work","at","alibaba" };
//	char** pa = a;
//	pa++;
//	printf("%s\n", *pa);
//	return 0;
//}


//int main()
//{
//	char* c[] = { "ENTER","NEW","POINT","FIRST" };
//	char** cp[] = { c + 3,c + 2,c + 1,c };
//	char** cpp = cp;
//	printf("%s\n", **++cpp);//POINT
//	printf("%s\n", *-- * ++cpp + 3);//ER
//	printf("%s\n", *cpp[-2] + 3);//ST
//	printf("%s\n", cpp[-1][-1] + 1);//EW
//	return 0;
//}


struct Test
{
	int Num;
	char* pcName;
	short sDate;
	char cha[2];
	short sBa[4];
}*p = (struct Test*)0x100000;

int main()
{
	printf("%p\n", p + 0x1);
	printf("%p\n", (unsigned long)p + 0x1);
	printf("%p\n", (unsigned int*)p + 0x1);
	return 0;
}
